TableControl (1)

Hier werden verschiedene Möglichkeiten anhand eines Programms vorgestellt, die ein TableControl bietet. Es ist z.B. nicht möglich, die Selektion einer Zeile per Programm abzufragen. Mit einer kleinen Einschränkung geht es jedoch trotzdem.

Machmal ist es sinnvoll, direkt auf die Markierung einer Zeile im TableControl zu reagieren. Dies geht jedoch standardmäßig nicht, da das Markieren im TableControl intern gehandhabt wird. Folgendes Programm zeigt eine interne Tabelle im TableControl an. Mit einem Klick auf den Button am Anfang dieser Zeile wird die Zeile selbst markiert. Die eigentliche Markierspalte wird ausser Kraft gesetzt. Ausserdem wird das FELD2 auf eingabebereit gestellt und der Cursor auch auf das Feld platziert.

Zudem wird die Spalte mit dem zweiten Tabellenfeld hervorgehoben.


TableControl mit markierter Zeile

 Zu dem Programm-Coding müssen Sie noch das Dynpro 300 anlegen.

REPORT zzenno39 .

TYPE-POOLS cxtab.

DATA:
  ok_code     TYPE syucomm,
  zeile(6)    TYPE n,
  zeile_tc(6) TYPE n,
  cols        TYPE cxtab_column,
  scr         LIKE screen,
  BEGIN OF itab OCCURS 0,
    mark,
    feld1(10),
    feld2(4),
    feld3(5),
  END OF itab.

CONTROLS: tc_itab TYPE TABLEVIEW USING SCREEN 0300.

START-OF-SELECTION.

*-- Tabelle mit Beispieldaten füllen
  DO 30 TIMES.
    APPEND ' ABCDEFGHIJKLMNOPQRS' TO itab.
  ENDDO.

*-- Aufruf des Dynpros
  CALL SCREEN 300.

*&---------------------------------------------------------------------*
*&      Module  STATUS_0300  OUTPUT
*&---------------------------------------------------------------------*
MODULE status_0300 OUTPUT.

*-- Status und Titel setzen
  SET PF-STATUS 'TEST1'.
  SET TITLEBAR 'TEST1'.

*-- Falls gerade der Markierbutton gedrückt wurde, den Cursor auf das
*-- Feld2 dieser Zeile setzen:
  IF ok_code(3) = 'PB_'.
    SET CURSOR FIELD 'ITAB-FELD2' LINE zeile_tc.
  ENDIF.

  CLEAR ok_code.

*-- Richtige Markierspalte ausser Kraft setzen
  LOOP AT SCREEN.
    IF screen-name = 'ITAB-MARK'.
      screen-input = '0'.
      MODIFY SCREEN.
    ENDIF.
  ENDLOOP.

ENDMODULE.                 " STATUS_0300  OUTPUT

*---------------------------------------------------------------------*
*       MODULE tc_itab_change_tc_attr OUTPUT                          *
*---------------------------------------------------------------------*
MODULE tc_itab_change_tc_attr OUTPUT.

  DESCRIBE TABLE itab LINES tc_itab-lines.

*-- Feld2 hervorheben
  LOOP AT tc_itab-cols INTO cols WHERE screen-name = 'ITAB-FELD2'.
    scr             = cols-screen.
    scr-intensified = '1'.
    cols-screen     = scr.
    MODIFY tc_itab-cols FROM cols.
  ENDLOOP.

ENDMODULE.

*&---------------------------------------------------------------------*
*&      Module  USER_COMMAND_0300  INPUT
*&---------------------------------------------------------------------*
MODULE user_command_0300 INPUT.

  IF ok_code(3) = 'PB_'.
*-- Drucktaste im TableControl wurde gedrückt
*-- Alte Markierung löschen
    READ TABLE itab WITH KEY mark = 'X'.
    IF sy-subrc = 0.
      itab-mark = space.
      MODIFY itab INDEX sy-tabix.
    ENDIF.
*-- Neue Markierung setzen/ zurücknehmen
    zeile_tc = ok_code+3(2).
    zeile = tc_itab-top_line + zeile_tc - 1.
    READ TABLE itab INDEX zeile.
    CHECK sy-subrc = 0.
    IF itab-mark = 'X'.
      itab-mark = ' '.
    ELSE.
      itab-mark = 'X'.
    ENDIF.
    MODIFY itab INDEX sy-tabix.

  ELSE.
    CASE ok_code.
      WHEN 'BACK'.
*-- Dynpro verlassen
        LEAVE TO SCREEN 0.

    ENDCASE.
  ENDIF.

ENDMODULE.                 " USER_COMMAND_0300  INPUT

*&---------------------------------------------------------------------*
*&      Module  TC_ITAB_change_field_attr  OUTPUT
*&---------------------------------------------------------------------*
MODULE tc_itab_change_field_attr OUTPUT.

  IF tc_itab-current_line = zeile.
*-- Aktuelle Zeile Eingabebereit setzen
    LOOP AT SCREEN.
      IF screen-name = 'ITAB-FELD2'.
        IF itab-mark = 'X'.
          screen-input = '1'.
        ELSE.
          screen-input = '0'.
        ENDIF.
        MODIFY SCREEN.
      ENDIF.
    ENDLOOP.
  ENDIF.

ENDMODULE.                 " TC_ITAB_change_field_attr  OUTPUT

*&---------------------------------------------------------------------*
*&      Module  daten_uebernehmen  INPUT
*&---------------------------------------------------------------------*
MODULE daten_uebernehmen INPUT.

*-- Eingegebene Daten in interne Tabelle übernehmen
  PERFORM daten_uebernehmen.

ENDMODULE.                 " daten_uebernehmen  INPUT

*&---------------------------------------------------------------------*
*&      Form  daten_uebernehmen
*&---------------------------------------------------------------------*
FORM daten_uebernehmen.

  MODIFY itab INDEX tc_itab-current_line.

ENDFORM.                    " daten_uebernehmen

Hier die Ablauflogik für das Dynpro 300.

*********************************************************************
*** DYNPRO 300
*********************************************************************
PROCESS BEFORE OUTPUT.
  module tc_itab_change_tc_attr.
  LOOP AT   itab
       WITH CONTROL tc_itab
       CURSOR tc_itab-current_line.
    field: itab-feld1, itab-feld2, itab-feld3.
    MODULE tc_itab_change_field_attr.
  ENDLOOP.

  MODULE status_0300.

*
PROCESS AFTER INPUT.
  LOOP AT itab.
    module daten_uebernehmen.
  ENDLOOP.

  MODULE user_command_0300.

Der TableControl auf dem Dynpro hat den Namen TC_ITAB, der Druckknopf, der in die Tabellenzeile eingefügt werden muss, hat als OK_CODE “PB_%%“.

Enno Wulff